package com.java.base.exercise.leetcode;

import java.util.Arrays;

/**
 * @Author RenPu
 * @Date 2024/2/19 21:27
 * @Version 1.0
 * @Description: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
 *
 * 请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
 *
 * 注意：最终，合并后数组不应由函数返回，而是存储在数组 nums1 中。为了应对这种情况，nums1 的初始长度为 m + n，其中前 m 个元素表示应合并的元素，后 n 个元素为 0 ，应忽略。nums2 的长度为 n 。
 *
 **/
public class Exercise01 {

    public static void main(String[] args) {

        int [] nums1 ={1,2,3,0,0,0};
        int m = 3;
        int [] nums2 ={2,5,6};
        int n = 3;

        /**
         * 第一种解决方法
         */
//        System.arraycopy(nums2,0,nums1,m,n);
//        Arrays.sort(nums1);
//        System.out.println("sort after result :::::::::"+Arrays.toString(nums1));

        /**
         * 第二种解决方法
         */

        int []nums1_copy = new int[m];
         System.arraycopy(nums1,0, nums1_copy, 0, m);
        int p1 =0;
        int p2 = 0;
        int p = 0;
        while((p1<m) &&(p2<n)){
            if(nums1_copy[p1]<nums2[p2]){
                nums1[p++]=nums1_copy[p1++];
            }else {
                nums1[p++]=nums2[p2++];

            }
        }

        if(p1 <m){
            System.arraycopy(nums1_copy, p1,nums1,p1 + p2,m +n - p1 - p2);
        }
        if (p2<n){
            System.arraycopy(nums2, p2, nums1, p1 + p2, m +n -p1 - p2);
        }
//
        System.out.println("sort after result :::::::::"+Arrays.toString(nums1));


        /**
         * 第三种解决方法
         */

//        int p1=m-1;
//        int p2 =n-1;
//        int p=m+n-1;
//        while((p1 >= 0) &&(p2 >= 0))
//            nums1[p--]=(nums1[p1]<nums2[p2]) ?nums2[p2--]:nums1[p1--];
//        System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
//
//     System.out.println("sort after result three :::::::::"+Arrays.toString(nums1));

    }


}
